// 03_signal_semaphore.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#define SEM_KEY 1234  // 定义信号灯集的键

int main() {
    int semid;
    struct sembuf sem_buf;

    // 获取现有的信号灯集
    semid = semget(SEM_KEY, 1, 0666);
    if (semid == -1) {
        perror("semget 获取信号灯集失败");
        exit(EXIT_FAILURE);
    }

    // 设置 V 操作（信号/加操作）
    sem_buf.sem_num = 0;  // 信号灯编号
    sem_buf.sem_op = 1;   // V 操作（加操作）
    sem_buf.sem_flg = SEM_UNDO;  // 操作完成后自动恢复

    printf("退出临界区...\n");
    if (semop(semid, &sem_buf, 1) == -1) {  // 执行 V 操作
        perror("semop 执行 V 操作失败");
        exit(EXIT_FAILURE);
    }

    printf("已退出临界区。\n");

    // 删除信号灯集
    if (semctl(semid, 0, IPC_RMID) == -1) {
        perror("semctl 删除信号灯集失败");
        exit(EXIT_FAILURE);
    }

    printf("信号灯集已删除。\n");
    return 0;
}